package com.mgq.java8.stream;

import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * <b>功能：</b>构造流<br>
 * <b>Copyright TCSL</b>
 * <li>版本&nbsp;&nbsp;&nbsp;&nbsp;修改日期&nbsp;&nbsp;&nbsp;&nbsp;部　　门&nbsp;&nbsp;&nbsp;&nbsp;作　者&nbsp;&nbsp;&nbsp;&nbsp;变更内容</li><hr>
 * <li>v1.0&nbsp;&nbsp;&nbsp;&nbsp;20220414&nbsp;&nbsp;营业后台&nbsp;&nbsp;&nbsp;&nbsp;马广奇&nbsp;&nbsp;&nbsp;&nbsp;创建类</li>
 * <br><br>
 *
 * @author 马广奇
 * @version 2022-04-14 20:50
 */
public class GenerateStream {
    /**
     * 1.由值创建流
     */
    public static void build() {
        //由值生成stream
        Stream<String> alpha = Stream.of("A", "B", "C", "D");

    }

    /**
     * 2.由数组创建流
     */
    public static void arrayBuild() {
        int[] numbers = {2, 3, 5, 7, 11, 13};
        int sum = Arrays.stream(numbers).sum();
        System.out.println(sum);
    }

    /**
     * 3.由文件生成流
     */
    public static void fileBuild() {
        long uniqueWords = 0;
        try (Stream<String> lines =
                     Files.lines(Paths.get("data.txt"), Charset.defaultCharset())) {
            uniqueWords = lines.flatMap(line -> Arrays.stream(line.split(" ")))
                    .distinct()
                    .count();
        } catch (IOException e) {

        }
    }

    /**
     * 由函数生成流 iterator
     * iterate方法接受一个初始值（在这里是0），还有一个依次应用在每个产生的新值上的Lambda（UnaryOperator<t>类型）。
     */
    public static void iterateBuild() {
        List<Integer> collect = Stream.iterate(0, n -> n * 2)
                .limit(10)
                .collect(Collectors.toList());
    }

    /**
     *与iterate方法类似，generate方法也可让你按需生成一个无限流。但generate不是依次
     * 对每个新生成的值应用函数的。它接受一个Supplier<T>类型的Lambda提供新的值。
     */
    public static void generateBuild() {
        List<Double> collect = Stream.generate(Math::random)
                .limit(10)
                .collect(Collectors.toList());
        collect.forEach(System.out::println);
    }

    public static void main(String[] args) {
        arrayBuild();
        generateBuild();
    }
}
